#include <thread>
#include <iostream>
#include <unistd.h> // usleep
#include <mutex>   // std::once_flag和std::call_once()函数需要包含这个头文件
using namespace std;
// g++ -pthread thread_4.cpp -o thread_4

once_flag onceflag;   // once_flag全局变量。 本质是取值为0和1的锁
// 在线程中，打算只调用一次的函数
void once_func(const int bh, const string& str){
   cout << "once_func() bh= " << bh << ",str="  << str << endl;
}

// 普通函数
void func(int bh, const string& str){
   // once_func(0,"各位观众，我要开始表白了。");// 这样会在子线程中调用多次
   call_once(onceflag, once_func,0,"各位观众，我要开始表白了。"); 
   for(int i = 1; i <= 3; i++){
    cout << "第" << i << "次表白：亲爱的" << bh << "号, " << str << endl;
    // usleep(1000000);  // 睡眠 1000000 微秒（1 秒）
    this_thread::sleep_for(chrono::seconds(1));  // 休眠1s
   }
}

int main()
{
   // once_func(0,"各位观众，我要开始表白了。");

    // 用普通函数创建线程
   thread t1(func,3,"我是一只傻傻鸟。");
   thread t2(func,8,"我是一只小小鸟。");

   t1.join();   // 回收线程t1的资源
   t2.join();   // 回收线程t2的资源

}